summaryrefslogblamecommitdiffstatshomepage
path: root/frontend/src/routes/archives/[id]/+page.svelte
blob: 9eedcb2f10a819c3fac15a3bd09ddc8024497718 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12



                                                                                                      
                                                               






                                                               
                                                       
                                                                               





                                                                     
                                                  
 
                                           

                                           
 

                                                                                                       

         




                                                           
 

                                                                     
 




                                                                                           
                 
           











                                                         
                                                                          

                                                                    
                                                            

                                                                 
                                                                  





                                                                   
                                                                                          








                                                                             
<script lang="ts">
	import { updateArchives } from '$gql/Mutations';
	import { archiveQuery } from '$gql/Queries';
	import { Direction, Layout, type FullArchiveFragment, type PageFragment } from '$gql/graphql';
	import { initReaderContext } from '$lib/Reader.svelte';
	import { toastFinally } from '$lib/Toasts';
	import Guard from '$lib/components/Guard.svelte';
	import Head from '$lib/components/Head.svelte';
	import Titlebar from '$lib/components/Titlebar.svelte';
	import Grid from '$lib/containers/Grid.svelte';
	import Gallery from '$lib/gallery/Gallery.svelte';
	import PageView from '$lib/reader/PageView.svelte';
	import Reader from '$lib/reader/Reader.svelte';
	import { initSelectionContext } from '$lib/selection/Selection.svelte';
	import ArchiveDelete from '$lib/tabs/ArchiveDelete.svelte';
	import ArchiveDetails from '$lib/tabs/ArchiveDetails.svelte';
	import ArchiveEdit from '$lib/tabs/ArchiveEdit.svelte';
	import Tab from '$lib/tabs/Tab.svelte';
	import Tabs from '$lib/tabs/Tabs.svelte';
	import { getContextClient } from '@urql/svelte';
	import type { PageProps } from './$types';

	let { data }: PageProps = $props();
	const client = getContextClient();
	const reader = initReaderContext();

	function updateCover(id: number) {
		updateArchives(client, { ids: data.id, input: { cover: { id } } }).catch(toastFinally);
	}

	let selection = initSelectionContext<PageFragment>(
		'Page',
		(p) => p.path,
		(p) => p.comicId === null
	);

	let result = $derived(archiveQuery(client, { id: data.id }));
	let archive: FullArchiveFragment | undefined = $state();

	$effect(() => {
		if (!$result.stale && $result.data?.archive.__typename === 'FullArchive') {
			archive = $result.data.archive;
			reader.pages = $result.data.archive.pages;
			selection.view = $result.data.archive.pages;
		}
	});
</script>

<Head section="Archive" title={archive?.name} />

{#if archive}
	<Grid>
		<header>
			<Titlebar title={archive.name} />
		</header>

		<aside>
			<Tabs>
				<Tab initial id="details" title="Details">
					<ArchiveDetails {archive} />
				</Tab>
				<Tab id="edit" title="Edit">
					<ArchiveEdit {archive} />
				</Tab>
				<Tab id="deletion" title="Delete">
					<ArchiveDelete {archive} />
				</Tab>
			</Tabs>
		</aside>

		<main class="overflow-auto">
			<Gallery pages={archive.pages} open={reader.open} {updateCover} />
		</main>
	</Grid>
{:else}
	<Guard {result} />
{/if}

<Reader>
	<PageView layout={Layout.Single} direction={Direction.LeftToRight} />
</Reader>